package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IChannelDAO;
import org.jsola.hr.dto.ChannelAddDTO;
import org.jsola.hr.dto.ChannelUpdateDTO;
import org.jsola.hr.entity.ChannelDO;
import org.jsola.hr.query.ChannelQuery;
import org.jsola.hr.vo.ChannelImportExcelVO;
import org.jsola.hr.vo.ChannelListVO;
import org.jsola.hr.vo.ChannelVO;
import org.jsola.hr.vo.HrSiteVO;
import org.jsola.salary.query.ChannelFeeSettlementQuery;
import org.jsola.salary.vo.ChannelFeeSum;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;


/**
 * 渠道管理
 *
 * @author zhr
 */
public interface IChannelService extends IService<IChannelDAO, ChannelDO> {

    /**
     * 渠道同步到招聘经纪人
     *
     * @param tokenUser  当前用户
     * @param channelIds 渠道ids
     * @return 渠道管理展示对象
     */
    Integer synchronizationBroker(String[] channelIds, TokenUser tokenUser);

    /**
     * 新增渠道管理
     *
     * @param channelAddDTO 新增渠道管理DTO
     * @param isException   重复是否抛出异常
     * @param tokenUser     当前用户
     * @return 渠道管理详情信息
     */
    ChannelVO save(ChannelAddDTO channelAddDTO, Boolean isException, TokenUser tokenUser);

    /**
     * 导入excel，新增渠道管理
     *
     * @param file      excel
     * @param tokenUser 当前用户
     * @return 出错的数据(电话或者名称重复)
     */
    ChannelImportExcelVO importChannel(File file, TokenUser tokenUser);


    /**
     * 修改渠道管理
     *
     * @param channelUpdateDTO 修改渠道管理DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(ChannelUpdateDTO channelUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除渠道管理，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param channelIds 渠道管理id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... channelIds);

    /**
     * 根据渠道管理id查找
     *
     * @param channelId 渠道管理id
     * @param siteId    所属站点id
     * @return 渠道管理详情信息
     */
    ChannelVO selectById(String channelId, String siteId);

    /**
     * 根据渠道管理id查找
     *
     * @param channelIds 渠道管理id集合
     * @param siteId     所属站点id
     * @return 渠道管理详情信息
     */
    List<ChannelVO> selectByIds(List<String> channelIds, String siteId);

    /**
     * 查询渠道管理
     *
     * @param channelQuery 查询条件
     * @param siteId       所属站点id
     * @return 渠道管理列表信息
     */
    List<ChannelListVO> select(ChannelQuery channelQuery, String siteId);

    /**
     * 查询渠道管理记录数
     *
     * @param channelQuery 查询条件
     * @param siteId       所属站点id
     * @return 渠道管理记录数
     */
    int selectCount(ChannelQuery channelQuery, String siteId);

    /**
     * 分页查询渠道管理
     *
     * @param channelQuery 查询条件
     * @param siteId       所属站点id
     * @return 渠道管理列表信息
     */
    Page<ChannelListVO> selectPage(ChannelQuery channelQuery, String siteId);

    /**
     * 分页查询渠道管理
     *
     * @param channelQuery 查询条件
     * @param siteId       所属站点id
     * @return 渠道管理列表信息
     */
    Page<ChannelListVO> selectPageAndCompany(ChannelQuery channelQuery, String siteId);


    /**
     * 根据渠道管理id查找
     *
     * @param channelId 渠道管理id
     * @param siteId    所属站点id
     * @return 渠道管理
     */
    ChannelDO selectDOById(String channelId, String siteId);

    /**
     * 查询渠道管理
     *
     * @param channelQuery 查询条件
     * @param siteId       所属站点id
     * @return 渠道管理列表
     */
    List<ChannelDO> selectDO(ChannelQuery channelQuery, String siteId);

    /**
     * 根据渠道id查询人数
     *
     * @param channelId 渠道id
     * @param tokenUser 当前用户
     * @return 人数
     */
    Integer selectCountByChannelId(String channelId, TokenUser tokenUser);

    /**
     * 根据渠道id查询人数
     *
     * @param list      渠道信息
     * @param tokenUser 当前用户
     */
    void selectCountByChannelIdList(List<ChannelListVO> list, TokenUser tokenUser);

    /**
     * 根据渠道分组id查询人数
     *
     * @param channelGroupId 渠道分组id
     * @param tokenUser      当前用户
     * @return 人数
     */
    Integer selectCountByChannelGroupId(String channelGroupId, TokenUser tokenUser);

    /**
     * 根据外包员工手机号查询渠道管理
     *
     * @param phone  手机号
     * @param siteId 所属站点id
     * @return 渠道管理列表
     */
    ChannelVO selectByPhone(String phone, String siteId);

    /**
     * 渠道管理名称查询渠道管理信息
     *
     * @param name   渠道管理名称
     * @param siteId 所属站点id
     * @return 渠道管理信息
     */
    ChannelVO selectByName(String name, String siteId);

    /**
     * 渠道管理名称列表查询渠道管理信息
     *
     * @param nameList 渠道管理名称列表
     * @param siteId   所属站点id
     * @return 渠道管理信息
     */
    List<ChannelDO> selectByNameList(List<String> nameList, String siteId);

    /**
     * 根据外包员工手机号查询渠道管理
     *
     * @param phones 手机号集合
     * @param siteId 所属站点id
     * @return 渠道管理列表
     */
    List<ChannelVO> selectByPhones(List<String> phones, String siteId);

    /**
     * 根据外包员工手机号查询渠道管理
     *
     * @param empId  员工id
     * @param siteId 所属站点id
     * @return 渠道管理列表
     */
    ChannelVO selectByEmpId(String empId, String siteId);

    /**
     * 根据外包员工手机号查询渠道管理
     *
     * @param empIds 员工id集合
     * @param siteId 所属站点id
     * @return 渠道管理列表
     */
    List<ChannelVO> selectByEmpIds(List<String> empIds, String siteId);

    /**
     * 管理端小程序（甲方端小程序）登录查询所属租户、用工单位分组、用工单位
     * @param userId 用户Id
     * @return 用户渠道所在公司
     */
    List<HrSiteVO> selectSiteByUserId(String userId);

    /**
     * 查询用户在站点下的渠道信息
     *
     * @param userId 用户Id
     * @return 用户渠道所在公司
     */
    ChannelDO selectByUserIdAndSite(String userId, String siteId);


    /**
     * 查询用户在指定站点下的渠道信息
     *
     * @param userId 用户Id
     * @param siteId 站点Id
     * @return 用户在指定站点下的渠道信息
     */
    List<ChannelDO> selectByUserIdAndSiteId(String userId, String siteId);

    /**
     * 导出渠道信息
     *
     * @param channelQuery 查询条件
     * @param tokenUser    当前用户
     * @return 文件路径
     */
    String channelInfoExport(ChannelQuery channelQuery, TokenUser tokenUser);

    /**
     * 通过身份证查询
     *
     * @param idCard    身份证号
     * @param tokenUser 当前用户
     * @return 渠道
     */
    ChannelVO selectByIdCard(String idCard, TokenUser tokenUser);

    /**
     * 根据分组id查询渠道
     *
     * @param channelGroupIds 分组ids
     * @param tokenUser      当前用户
     * @return list
     */
    List<ChannelDO> selectByGroupIds(List<String> channelGroupIds, TokenUser tokenUser);

    /**
     * 根据分组id查询渠道
     *
     * @param channelGroupId 分组id
     * @param tokenUser      当前用户
     * @return list
     */
    List<ChannelDO> selectByGroupId(String channelGroupId, TokenUser tokenUser);

    /**
     * 分页获取渠道详情（渠道列表用）
     *
     * @param channelQuery 查询条件
     * @param tokenUser    当前用户
     * @return 渠道详情
     */
    Page<ChannelListVO> pageChannelList(ChannelQuery channelQuery, TokenUser tokenUser);

    /**
     * 查询指定年月的合计
     *
     * @param channelFeeSettlementQuery 查询条件
     * @param tokenUser                 当前用户
     * @return 合计
     */
    ChannelFeeSum feeSum(ChannelFeeSettlementQuery channelFeeSettlementQuery, TokenUser tokenUser);

    void updatePhone(String userId, String phone);
}


